package untils

import (
	"errors"
	"getaway/basic/config"
	__ "getaway/basic/proto/baseproto"
	"github.com/gin-gonic/gin"
	"log"
	"os"
	"path/filepath"
)

func UploadOneCompressedFile(c *gin.Context, url string) (string, error) {
	filename := filepath.Base(url)

	// 允许的安装包文件扩展名
	var allowedInstallerExtensions = map[string]bool{
		".exe":    true, // Windows可执行安装程序
		".msi":    true, // Windows安装包
		".dmg":    true, // macOS安装包
		".pkg":    true, // macOS安装包
		".deb":    true, // Debian/Ubuntu安装包
		".rpm":    true, // RedHat/CentOS安装包
		".app":    true, // macOS应用程序包
		".zip":    true, // 压缩的安装包
		".tar.gz": true, // 压缩的安装包
	}
	if !allowedInstallerExtensions[filepath.Ext(filename)] {
		return "", errors.New("文件类型错误,请上传zip、rar、7z、tar、exe、msi、dmg、pkg、deb、rpm、app或gz格式的压缩包")
	}

	res, err := config.BaseClient.OssUploadPart(c, &__.OssUploadPartReq{
		ObjectName: filename,
		Url:        url,
	})
	if err != nil {
		return "", errors.New("oss上传文件失败" + err.Error())
	}

	return res.Url, nil
}

// 上传一张图片
func UploadOneImg(c *gin.Context) (string, error) {
	file, err := c.FormFile("image")
	if err != nil {
		return "", errors.New("获取文件失败" + err.Error())
	}
	log.Println("上传的压缩包名:", file.Filename)

	// 允许的安装包文件扩展名
	var allowedInstallerExtensions = map[string]bool{
		".jpg":  true,
		".png":  true,
		".jpeg": true,
		".gif":  true,
	}
	if !allowedInstallerExtensions[filepath.Ext(file.Filename)] {
		return "", errors.New("文件类型错误,请上传jpg、png、jpeg或gif格式的图片")
	}

	// 定义文件保存路径
	saveDir := config.FileWay
	// 确保保存目录存在
	if err = os.MkdirAll(saveDir, 0755); err != nil {
		return "", errors.New("创建保存目录失败" + err.Error())
	}

	// 完整的文件路径
	dstPath := filepath.Join(saveDir, file.Filename)

	// 检查是否存在同名文件，存在则删除
	if _, err = os.Stat(dstPath); err == nil {
		// 文件存在，尝试删除
		if err = os.Remove(dstPath); err != nil {
			return "", errors.New("删除原有文件失败" + err.Error())
		}
		log.Println("已删除同名文件:", file.Filename)
	} else if !os.IsNotExist(err) {
		// 发生了其他错误
		return "", errors.New("检查文件状态失败" + err.Error())
	}

	// 保存上传的文件
	if err = c.SaveUploadedFile(file, dstPath); err != nil {
		return "", errors.New("保存文件失败" + err.Error())
	}
	return "http://localhost:8080/upload/" + file.Filename, nil
}
